<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<p>1.请修复给定的 js 代码中，函数定义存在的问题</p>
		<pre>
			function functions(flag) {
			    if (flag) {
			      function getValue() { return 'a'; }
			    } else {
			      function getValue() { return 'b'; }
			    }
			
			    return getValue();
			}
		</pre>
		<p>要点:else中的语句相当于将if中的function重写，因此无论flag为何值，返回的方法始终为重写后的方法。将方法赋值给一个变量，方法就不会被重写，因此才能得到正确的结果。</p>
		<script>
			function functions(flag) {
			    if (flag) {
			      var getValue=function() { return 'a'; }
			    } else {
			      var getValue=function() { return 'b'; }
			    }
			    return getValue();
			}
		</script>
		<p>2.修改 js 代码中 parseInt 的调用方式，使之更合理</p>
		<pre>
			function parse2Int(num) {
			    return parseInt(num,10);
			}
			parse2Int('12'); parse2Int('12px'); parse2Int('0x12');
			输出例子:
			12; 12; 0;
		</pre>
		<script type="text/javascript">
			function parse2Int(num) {
			    return parseInt(num,10);
			}
			console.log(parse2Int('0x12'))
		</script>
		<p>要点:如果 string 以 "0x" 开头，parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头，那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头，parseInt() 将把它解析为十进制的整数。</p>
		<p>
			3.实现一个打点计时器，要求<br />
			1、从 start 到 end（包含 start 和 end），每隔 100 毫秒 console.log 一个数字，每次数字增幅为 1
			<br />2、返回的对象中需要包含一个 cancel 方法，用于停止定时操作
			<br />3、第一个数需要立即输出
		</p>
		<script type="text/javascript">
			function count(start, end) {
				console.log(start);
			    start++;
			    var timer = setInterval(function(){
			        if(start<=end){
			        	console.log(start);
			            start++;
			    	}else{
			             clearInterval(timer);
			        }
			       
			    },100);
			    return {
			        cancel:function(){
			            clearInterval(timer);
			        }
			    }
			}
		</script>
		<p>
			4.实现 fizzBuzz 函数，参数 num 与返回值的关系如下：<br />
			1、如果 num 能同时被 3 和 5 整除，返回字符串 fizzbuzz<br />
			2、如果 num 能被 3 整除，返回字符串 fizz<br />
			3、如果 num 能被 5 整除，返回字符串 buzz<br />
			4、如果参数为空或者不是 Number 类型，返回 false<br />
			5、其余情况，返回参数 num 
		</p>
		<script type="text/javascript">
			function fizzBuzz(num) {
				if(typeof num != "number"){
			        return false;
			    }else{
			        switch(true){
			        case num%3==0&&num%5==0:
			            return "fizzbuzz";
			            break;
			        case num%3==0:
			            return "fizz";
			            break;
			        case num%5==0:
			            return "buzz";
			            break;
			        default: 
			            return  num;
			             break;   
			    	}
			    }
			}
		</script>
		<p>
			5.将数组 arr 中的元素作为调用函数 fn 的参数<br/>
			调用函数可以使用call或者apply这两个方法，区别在于call需要将传递给函数的参数明确写出来，是多少参数就需要写多少参数。而apply则将传递给函数的参数放入一个数组中，传入参数数组即可。
			<span>调用函数有3种方式：<br/>
				obj.func();<br/>
				func.call(obj,args);//参数列出<br/>
				func.apply(obj,[m,n......]);//参数数组
			</span>
		</p>
		<script type="text/javascript">
			function argsAsArray(fn, arr) {
				return fn.apply(null,arr)
			}
		</script>
		<p>
			6.将函数 fn 的执行上下文改为 obj 对象 
			<script>
				//apply
				function speak(fn, obj) {
				    return fn.apply(obj);
				}
				//call
				function speak(fn, obj) {
				    return fn.call(obj);
				}
				//bind
				function speak(fn, obj) {
				    return fn.bind(obj)();
				}
			</script>
		</p>
		<p>
			7.实现函数 functionFunction，调用之后满足如下条件：<br />
			1、返回值为一个函数 f <br />
			2、调用返回的函数 f，返回值为按照调用顺序的参数拼接，拼接字符为英文逗号加一个空格，即 ', '<br />
			3、所有函数的参数数量为 1，且均为 String 类型 
			<script>
				function functionFunction(str) {
					var f = function(s){
				        return str +", "+s;
				    }
				    return f;
				}
				console.log(functionFunction('Hello')('world'));
			</script>
		</p>
		<p>
			实现函数 makeClosures，调用之后满足如下条件： (闭包)
			1、返回一个函数数组 result，长度与 arr 相同
			2、运行 result 中第 i 个函数，即 result[i]()，结果与 fn(arr[i]) 相同 
			例子: <script>
				function makeClosures(arr, fn) {
	
				}
				var arr = [1, 2, 3]; 
				var square = function (x) { 
					return x * x; 
				}; 
				var funcs = makeClosures(arr, square); 
				funcs[1]();
			</script>
		</p>
		<p>
			已知 fn 为一个预定义函数，实现函数 curryIt，调用之后满足如下条件：<br />
			1、返回一个函数 a，a 的 length 属性值为 1（即显式声明 a 接收一个参数）<br />
			2、调用 a 之后，返回一个函数 b, b 的 length 属性值为 1<br />
			3、调用 b 之后，返回一个函数 c, c 的 length 属性值为 1<br />
			4、调用 c 之后，返回的结果与调用 fn 的返回值一致<br />
			5、fn 的参数依次为函数 a, b, c 的调用参数
			<pre>
				function curryIt(fn) {
				    var a,b,c;
					return a=function(x){
				        return b=function(y){
				            return c = function(z){
				                return fn(x,y,z);
				            }
				        }
				    }
				}
			</pre>
		</p>
		<p>
			求 a 和 b 相乘的值，a 和 b 可能是小数，需要注意结果的精度问题 <br/>
			multiply(3, 0.0001)
		</p>
		<script type="text/javascript">
			function multiply(a, b) {
				return a*b;
			}
		</script>
		
	</body>
</html>
